; int obtener_tabla_codificacion(codigo_t *tabla_codigos, unsigned int cant_codigos, codificacion_t **ptr_tabla_codificacion, unsigned int *tabla_codificacion_size);

%include "macros/personalizada.mac"
%include "macros/codigo_t.mac"
%include "macros/codificacion_t.mac"

extern calloc

global obtener_tabla_codificacion

%define ptr_tabla_codigos [ebp + 8]
%define cant_codigos [ebp + 12]
%define ptr_ptr_tabla_codificacion [ebp + 16]
%define ptr_tabla_codificacion_size [ebp + 20]

section .text

obtener_tabla_codificacion:
	push ebp
	mov ebp, esp
	push esi
	push edi
	push ebx
	
	; Reservamos memoria para la tabla codificacion.
	mov eax, cant_codigos
	push dword 9
	push eax
	call calloc
	add esp, 8
	cmp eax, 0
	je error
	mov esi, ptr_ptr_tabla_codificacion
	mov [esi], eax
	mov edi, eax
	
	; Calculamos el tamaño en bytes de la tabla codificacion.
	xor edx, edx
	mov eax, cant_codigos
	mov ebx, 9
	mul ebx
	mov esi, ptr_tabla_codificacion_size
	mov [esi], eax
	
	mov esi, ptr_tabla_codigos ; esi = recorre la tabla codigos.
	cmp esi, 0
	je error
	
	xor ecx, ecx
	
ciclo:
	
	shl ecx, 4 ; Multiplico ecx por 16.
	lea ebx, [esi + ecx] ; ebx = direccion del codigo actual.
	shr ecx, 4 ; Divido ecx por 16
	mov eax, [ebx + off_valido_cod] ; eax = validez del codigo actual.
	cmp eax, invalido
	je no_valido
	mov [edi + off_simbolo_codif], cl
	mov eax, [ebx + off_codigo_cod]
	mov [edi + off_codigo_codif], eax
	mov eax, [ebx + off_long_codigo_cod]
	mov [edi + off_long_codigo_codif], eax
	add edi, 9
	
no_valido:
	inc ecx
	cmp ecx, 256
	je termine
	jmp ciclo
	
termine:
	xor eax, eax
	jmp fin
	
error:
	mov eax, error_code
	
fin:
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret
